package com.SoftwareManage.controller;

import com.SoftwareManage.entity.Role;
import com.SoftwareManage.entity.User;
import com.SoftwareManage.entity.UserRole;
import com.SoftwareManage.service.RoleService;
import com.SoftwareManage.service.UserService;
import com.SoftwareManage.util.IpUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private RoleService roleService;

    private final static Logger logger = LoggerFactory.getLogger(UserController.class);

    //跳转到user页面
    @RequestMapping("/user")
    public String toSoftware(Model model, HttpServletRequest request){
        String ipAddr= IpUtil.getIpAddr(request);
        logger.info(ipAddr+"------跳转到用户信息页面------");
        List<User> users=userService.selectAll();
        List<Role> roles=roleService.selectAll();
        model.addAttribute("number",users.size());
        model.addAttribute("roles",roles);
        return "user";
    }


    //software页面list回调函数请求所有数据
    @RequestMapping(value = "/lists")
    @ResponseBody
    public Map<String, Object> showEntity(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer limit) throws IOException {
        List<User> users = userService.selectAll();
        int pageNum = (page - 1) * limit;
        List<UserRole> userRoles = userService.selectAlls(pageNum, limit);
        for (UserRole userRole:userRoles){
            String role_name=userService.selectRoleName(userRole.getId());
            userRole.setRole_name(role_name);
        }
        Map<String, Object> tableData = new HashMap<String, Object>();
        //这是layui要求返回的json数据格式
        tableData.put("code", 0);
        tableData.put("msg", "");
        //将全部数据的条数作为count传给前台（一共多少条）
        tableData.put("count", users.size());
        //将分页后的数据返回（每页要显示的数据）
        tableData.put("data", userRoles);
        //返回给前端
        return tableData;
    }

    //查询信息
    @RequestMapping(value = "/search", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> search(
            @RequestParam(required = false) String username,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer limit
    ) {
        Map<String, Object> tableData = new HashMap<String, Object>();
        List<User> users=userService.search(username);
        int pageNum = (page - 1) * limit;
        List<UserRole> userRoles= userService.searchs(username,pageNum, limit);
        for (UserRole userRole:userRoles){
            String role_name=userService.selectRoleName(userRole.getId());
            userRole.setRole_name(role_name);
        }
        tableData.put("code", 0);
        tableData.put("msg", "");
        //将全部数据的条数作为count传给前台（一共多少条）
        tableData.put("count", users.size());
        //将分页后的数据返回（每页要显示的数据）
        tableData.put("data", userRoles);
        //返回给前端
        return tableData;
    }

    //	修改信息
    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> editEntity(
            @RequestParam("id") int id,
            @RequestParam("username") String username,
            @RequestParam("tel") String tel,
            @RequestParam("status") String status,
            @RequestParam("role_id") int role_id,
            @RequestParam("remark") String remark,
            HttpServletRequest request){
        String ipAddr= IpUtil.getIpAddr(request);
        Map<String, Object> tableData = new HashMap<String, Object>();
        //超级管理员不能修改自己的信息
        if(username.equals("super")){
            tableData.put("code", 200);
            tableData.put("msg", "");
            //将全部数据的条数作为count传给前台（一共多少条）
            tableData.put("count", 0);
            //将分页后的数据返回（每页要显示的数据）
            tableData.put("data", "");
            logger.info(ipAddr+"------[user]超级管理员不能修改自己的信息------");
            //返回给前端
            return tableData;
        }
        userService.update(id, username,tel,status,remark,role_id);
        tableData.put("code", 100);
        tableData.put("msg", "");
        //将全部数据的条数作为count传给前台（一共多少条）
        tableData.put("count", 0);
        //将分页后的数据返回（每页要显示的数据）
        tableData.put("data", "");
        logger.info(ipAddr+"------[user]修改成功------");
        //返回给前端
        return tableData;
    }

    //	重置密码
    @RequestMapping(value = "/reset", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> resetEntity(
            @RequestParam("r_id") int id,
            @RequestParam("r_password") String r_password,
            @RequestParam("r_passwords") String r_passwords,
            HttpServletRequest request){
        String ipAddr= IpUtil.getIpAddr(request);
        Map<String, Object> tableData = new HashMap<String, Object>();
        if (!r_password.equals(r_passwords)){
            tableData.put("code", 200);
            tableData.put("msg", "密码不一致");
            //将全部数据的条数作为count传给前台（一共多少条）
            tableData.put("count", 0);
            //将分页后的数据返回（每页要显示的数据）
            tableData.put("data", "");
            logger.info(ipAddr+"------密码不一致,重置密码失败------");
            //返回给前端
            return tableData;
        }
        userService.resetPassword(id,r_password);
        tableData.put("code", 100);
        tableData.put("msg", "");
        //将全部数据的条数作为count传给前台（一共多少条）
        tableData.put("count", 0);
        //将分页后的数据返回（每页要显示的数据）
        tableData.put("data", "");
        logger.info(ipAddr+"------重置密码成功------");
        //返回给前端
        return tableData;
    }

    //	添加信息
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> addEntity(
            @RequestParam("a_username") String username,
            @RequestParam("a_password") String password,
            @RequestParam("a_tel") String tel,
            @RequestParam("a_status") String status,
            @RequestParam("a_remark") String remark,
            @RequestParam("a_role_id") int role_id,
            HttpServletRequest request){
        String ipAddr= IpUtil.getIpAddr(request);
        Map<String, Object> tableData = new HashMap<String, Object>();
        List<String> usernames=userService.selectAllUsernames();
        if (usernames.contains(username)){
            tableData.put("code", 300);
            tableData.put("msg", "用户名已存在！");
            //将全部数据的条数作为count传给前台（一共多少条）
            tableData.put("count", 0);
            //将分页后的数据返回（每页要显示的数据）
            tableData.put("data", "");
            logger.info(ipAddr+"------[user]添加失败------");
            //返回给前端
            return tableData;
        }
        userService.add(username,password,tel,status,remark,role_id);
        tableData.put("code", 200);
        tableData.put("msg", "添加成功！");
        //将全部数据的条数作为count传给前台（一共多少条）
        tableData.put("count", 0);
        //将分页后的数据返回（每页要显示的数据）
        tableData.put("data", "");
        logger.info(ipAddr+"------[user]添加成功------");
        //返回给前端
        return tableData;
    }

    //删除信息
    @RequestMapping(value = "/remove", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> removeEntity(@RequestBody int[] ids,
                                            HttpServletRequest request) {
        String ipAddr= IpUtil.getIpAddr(request);
        Map<String, Object> tableData = new HashMap<String, Object>();
        for (int id : ids) {
            userService.delete(id);
        }
        tableData.put("code", 300);
        tableData.put("msg", "");
        //将全部数据的条数作为count传给前台（一共多少条）
        tableData.put("count", 0);
        //将分页后的数据返回（每页要显示的数据）
        tableData.put("data", "");
        logger.info(ipAddr+"------[user]删除成功------");
        //返回给前端
        return tableData;
    }

}
